package com.xgl.pojo;

import com.xgl.utils.Md5Utils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;

/**
 * @包名 com.xgl.pojo
 * @创建人 熊国林
 * @创建时间 2021/5/20
 * @描述 区块
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Block {
    String data;// 此区块保存的数据
    String Hash;// 此区块对应的hash值
    String previousHash;// 前一个区块的hash值


    public Block(String data, String previousHash) throws UnsupportedEncodingException, NoSuchAlgorithmException {
        this.data = data;
        this.Hash = this.computeHash();
        this.previousHash = previousHash;
    }

    @Override
    public String toString() {
        return "Block [data=" + data + ", Hash=" + Hash + ", previousHash=" + previousHash + "]";
    }
    /**
     *
     * 计算区块的hash值
     */
    public String computeHash() throws UnsupportedEncodingException, NoSuchAlgorithmException {
        //调整计算难度，新添加nonce
        return Md5Utils.SHA256(this.data + this.previousHash).toString();
    }

    //计算符合区块链难度要求的hash
//    public void mine(int difficulty){//传入参数为难度系数
//        while(true){
//            Hash = computeHash();
//            //如果算出的hash值的前n（n为难度系数）位不等于符合区块链难度要求的hash
//            if(!Hash.substring(0,difficulty).equals(getAnswer(difficulty))){
//                nonce++;//随机数+1，继续计算直到相同
//                this.Hash=this.computeHash();//把随机数+1计算出的新值传给原来的hash值
//            }else{
//                break;
//            }
//        }
//        System.out.println("挖矿结束" + Hash);
//    }

//    /**
//     * 解释什么是符合区块链难度要求的hash
//     */
//    public String getAnswer(int difficulty) {
//        //设置需求为开头前n位为0的hash
//        String answer = "";
//        for(int i = 0; i < difficulty; i++){
//            answer += '0';//难度1为1个0，难度2为2个0，难度参数difficult
//        }
//        return answer;
//    }

}
